﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TISModel;
using BTO;
using DAL;
using Exceptions;

namespace BLL
{
    public class BLLCliente
    {
        public List<BTO.Cliente> list()
        {
            DALCliente dalCliente = new DALCliente();
            return dalCliente.list();
        }

        public BTO.Cliente getByID(int id)
        {
            DALCliente dalCliente = new DALCliente();
            BTO.Cliente btoCliente = dalCliente.getByID(id);

            if (btoCliente == null)
            {
                throw new NotFoundClienteException("Cliente não encontrado!");
            }

            return btoCliente;
        }

        public BTO.Cliente getByPassaporte(String passaporte)
        {
            DALCliente dalCliente = new DALCliente();
            BTO.Cliente btoCliente = dalCliente.getByPassaporte(passaporte);

            if (btoCliente == null)
            {
                throw new PassaporteClienteException("Cliente com o passaporte indicado não encontrado!");
            }

            return btoCliente;
        }

        public void insert(BTO.Cliente toInsert)
        {
            DALCliente dalCliente = new DALCliente();
            BTO.Cliente btoCliente;

            if (toInsert.nome == null || toInsert.nome == ""
            || toInsert.morada == null || toInsert.morada == ""
            || toInsert.codpostal == null || toInsert.codpostal == ""
            || toInsert.localizacao == null || toInsert.localizacao == ""
            || toInsert.telefone == null || toInsert.telefone == ""
            || toInsert.passaporte == null || toInsert.passaporte == ""
            || toInsert.email == null || toInsert.email == "") throw new InsertDadosClienteException("Preencha os campos obrigatórios!");

            btoCliente = dalCliente.getByPassaporte(toInsert.passaporte);
            if (btoCliente != null)
            {
                throw new PassaporteClienteException("Já existe um cliente com o passaporte indicado!");
            }

            try
            {
                dalCliente.insert(toInsert);
            }
            catch (Exception e)
            {
                throw new InsertClienteException(e.Message);
            }
        }

        public void update(BTO.Cliente toUpdate)
        {
            DALCliente dalCliente = new DALCliente();
            BTO.Cliente btoCliente;

            if (toUpdate.nome == null || toUpdate.nome == ""
            || toUpdate.morada == null || toUpdate.morada == ""
            || toUpdate.codpostal == null || toUpdate.codpostal == ""
            || toUpdate.localizacao == null || toUpdate.localizacao == ""
            || toUpdate.telefone == null || toUpdate.telefone == ""
            || toUpdate.passaporte == null || toUpdate.passaporte == ""
            || toUpdate.email == null || toUpdate.email == "") throw new InsertDadosClienteException("Verifique os campos obrigatórios!");

            try
            {
                btoCliente = dalCliente.getByPassaporte(toUpdate.passaporte);
                if (btoCliente.IDCliente != toUpdate.IDCliente)
                {
                    throw new PassaporteClienteException("Já existe um cliente com o passaporte indicado!");
                }
            }
            catch (Exception)
            {
                throw new Exception("Ocorreu um erro ao actualizar o cliente!");
            }

            try
            {
                dalCliente.update(toUpdate);
            }
            catch (Exception e)
            {
                throw new UpdateAgenciaException(e.Message);
            }
        }

        public void delete(int id)
        {
            DALCliente dalCliente = new DALCliente();
            DALReserva dalReserva = new DALReserva();
            DALContacto dalContacto = new DALContacto();


            List<BTO.Reserva> listReservas = dalReserva.getByCliente(id);
            if (listReservas.Count() > 0)
            {
                throw new ReservasAssociadasClienteException("Existem reservas associadas à este cliente!");
            }

            List<BTO.Contacto> listContactos = dalContacto.getByCliente(id);
            if (listContactos.Count() > 0)
            {
                throw new ContactosAssociadasClienteException("Existem contactos associadas à este cliente!");
            }

            try
            {
                dalCliente.delete(id);
            }
            catch (Exception e)
            {
                throw new DeleteClienteException(e.Message);
            }
        }
    }
}
